/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Metoder;

import java.io.Serializable;
import java.text.NumberFormat;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.swing.JOptionPane;
import javax.swing.JOptionPane.*;

/**
 *
 * @author Stine
 */
@ManagedBean(name="mrBean")
@SessionScoped
public class mrBean implements Serializable {
    private double nyML;
    private double mL_TilsattBase = 0;
    private static double ML_HCL = 50;
    private static double KONS_BASE = 0.0001;
    private static double START_MOL_SYRE = (5.0 * Math.pow(10, -3));
    private ArrayList<Double> mLTilsatteBaser = new ArrayList<Double>();
    private ArrayList<Double> pHListe = new ArrayList<Double>();
    private ArrayList<Observasjon> obs = new ArrayList<Observasjon>();
    private String feilMelding = null;

    public mrBean() {
        setNyML(0.0);
    }

    public double getNyML() {
        return nyML;
    }

    public void setNyML(double nyML) {
        if(nyML<0) {
            setFeilMelding("Skriv inn positivt tall! ERROR!!");
        } else {
            setFeilMelding(null);
            this.nyML = nyML;
            
            mL_TilsattBase += nyML;
            mLTilsatteBaser.add(mL_TilsattBase);
            calcPH();
        }
    }

    public void setFeilMelding(String feilMelding) {
        this.feilMelding = feilMelding;
    }

    public String getFeilMelding() {
        return feilMelding;
    }

    public boolean isFeilmelding(){
        return feilMelding != null;
    }

    public double antMolBase() {
        double antMol = (KONS_BASE * mL_TilsattBase);
        return antMol;
    }

    public double antMolSyre() {
        return START_MOL_SYRE - antMolBase();
    }

    public double totalVolumLiter() {
        return (mL_TilsattBase + ML_HCL)/1000;
    }

    public double konsAvHIoner() {
        double kons = antMolSyre()/totalVolumLiter();
        return kons;
    }

    public double konsAvOHIoner(){
        return ((antMolBase() - START_MOL_SYRE) / totalVolumLiter());
    }

    public void calcPH() {
        double pH = 0;
        if(konsAvHIoner() < 0.0) {
            pH = 14 + Math.log10(konsAvOHIoner());
            System.out.println("mindre enn 0");
        } else if(konsAvHIoner() == 0.0){
            pH = 7;
            System.out.println("Du har nådd ekvivalenspunktet!" + "\n" + "Konsentrasjonen av H+ ioner = konsentrasjonen av OH- ioner, og løsningen er nøytral.");
        } else {
            pH = - Math.log10(konsAvHIoner());
        }
        
        pHListe.add(pH);
        obs.add(new Observasjon(mL_TilsattBase, antMolBase(), konsAvHIoner(),pH));
    }

    public double getPH() {
        Observasjon o = sisteObservasjon();
        return o != null? o.getpH():1.0;
    }

    public double antVolumBase() {
        return mL_TilsattBase;
    }

    public String kooridinater() {
        String kor = "";
        for (int i = 0; i < mLTilsatteBaser.size(); i++) {
             kor += mLTilsatteBaser.get(i);
             if(i < (mLTilsatteBaser.size() - 1)) { //legger ikke til på siste x-verdi
                 kor += "%2C";
             }
        }
        kor += "%7C";
        for(int j = 0; j < pHListe.size(); j++) {
            double pH = pHListe.get(j);
            if(pH == Double.NEGATIVE_INFINITY || pH == Double.POSITIVE_INFINITY){
                kor += "7";
            }
            else{
                String phVerdi = ""+pH;
                phVerdi = phVerdi.substring(0, Math.min(phVerdi.length(), 4));
                kor += phVerdi;
            }
            if(j < (pHListe.size() - 1)) { //legger ikke til på siste y-verdi
                 kor += "%2C";
             }
        }
        return kor;
    }

    public Observasjon sisteObservasjon() {
        if(obs.size() > 0) {
            return obs.get(obs.size() - 1);
        }
        return null;
    }

    public boolean isEkvivalenspunkt() {
        return Math.abs(getPH()- 7.0)< 0.01;
    }

    public ArrayList<Observasjon> getObs() {
        return obs;
    }

    public String format(double tall) {
     NumberFormat nf = NumberFormat.getNumberInstance() ;
        nf.setGroupingUsed(false) ;     // don't group by threes
        nf.setMaximumFractionDigits(5) ;
        nf.setMinimumFractionDigits(5) ;
        String s = nf.format(tall);
        return s;
    }
}
